//! 给定一个数组 prices ，它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

//! 你只能选择 某一天 买入这只股票，并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

//! 返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润，返回 0 。

 

//! 示例 1：

//! 输入：[7,1,5,3,6,4]
//! 输出：5
//! 解释：在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = 6-1 = 5 。
//!      注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格；同时，你不能在买入前卖出股票。

//! 示例 2：

//! 输入：prices = [7,6,4,3,1]
//! 输出：0
//! 解释：在这种情况下, 没有交易完成, 所以最大利润为 0。

use core::num;

struct  Solution;

impl Solution {
    // 方法1  暴力计算，在leetcode中超时
    pub fn max_profit(prices: Vec<i32>) -> i32 {
        if prices.len() <1 {
            return 0;
        }
       let mut chazhi = 0;
       
       for i in 0..prices.len() {
           for j in i..prices.len() {
               if prices[j]>prices[i] && prices[j]-prices[i]>chazhi {
                   chazhi = prices[j]-prices[i];
               }
           }
       }

       
       return chazhi;
    }

    /// 方法2  不能局限于实际情况，用两个变量来记录最小买入价，和最大利润，初始，最小值就按第一个数据来，利润就是0.
    /// 后面每天都和最小买入价作比较，如果小于最小买入价，就更新当前买入价到变量，否则，比较当天减去最小买入价的利润是否大于原来的利润，大于就更新
    pub fn max_profit2(prices: Vec<i32>) -> i32 {
        if prices.len() <1 {
            return 0;
        }

        // 创建两个变量，表示最小买入价和最大利润
       let mut min_price = prices[0];
       let mut max_profit = 0;
       
       for i in 1..prices.len() {
           if prices[i]<min_price {
               min_price = prices[i];
           } else if prices[i]-min_price>max_profit {
                max_profit = prices[i]-min_price;
           }
       }

       
       return max_profit;
    }
}

#[cfg(test)]
mod test {
    use std::vec;

    use super::*;

    #[test]
    fn test() {
        let nums = vec![3,2,6,5,0,3];
        let n = Solution::max_profit(nums);
        println!("{n:?}");
    }

    
    #[test]
    fn test2() {
        let nums = vec![3,2,6,5,0,3];
        let n = Solution::max_profit2(nums);
        println!("{n:?}");
    }

}